package com.atguigu.test6;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

/**
 * @author 路飞
 * @date 2024/3/29 19:55
 * @description 假设日期段用两个6位长度的正整数表示，
 * 例如：(201401，201406)用来表示2014年1月到2014年6月，
 * 求两个日期段的重叠月份数。
 * 例如：输入：201401和201406，201403和201409，输出：4  因为两个日期之间有4个月是重复的
 * 解释：重叠月份：3,4,5,6月共4个月
 *
 *
 * // TODO 这个题目没有想象的那么简单，还得继续优化
 * // v2版本中已经实现了，自我感觉没有bug了，实际上有没有还不确定 不知道是不是漏掉了什么特殊情况
 */
public class Test3 {

    private static final List<String> list = Arrays.asList("01","02","03","04","05","06","07","08","09","10","11","12");

    public static void main(String[] args) {
        v2();
    }

    /**
     * @Description 这个版本就需要完整的进行判断了，需要判断年份，也需要判断月份
     */
    public static void v2() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入第一次的两个日期,格式：(201301,201406):");
        String oneDate = scanner.next();
        // 第一个日期中出现的每一年的每一个月份
        List<String> oneDateList = strToDate(oneDate);
//        System.out.println(oneDateList);


        System.out.print("请输入第二次的两个日期,格式：(201403,201409):");
        String twoDate = scanner.next();
        // 第二个日期中出现的每一年的每一个月份
        List<String> twoDateList = strToDate(twoDate);
//        System.out.println(twoDateList);

        // 计算两个集合中的重复月份
        List<String> repeatList = new ArrayList<>();
        for (String s : oneDateList) {
            if (twoDateList.contains(s)) {
                repeatList.add(s);
            }
        }
        System.out.println("重复月份有" + repeatList.size() + "个，分别为：" + repeatList);
    }

    private static List<String> strToDate(String str) {
        String[] arr = str.split(",");
        String oneYear = arr[0].substring(0, 4);
        String oneMonth = arr[0].substring(4);
        String twoYear = arr[1].substring(0, 4);
        String twoMonth = arr[1].substring(4);
        List<String> dateList = new ArrayList<>();
        for (int i = Integer.valueOf(oneYear); i <= Integer.valueOf(twoYear); i++) {
            Iterator<String> iterator = list.iterator();
            while (iterator.hasNext()) {
                String s = iterator.next();
                // 这个判断用来添加 202301,202403 这种数据中，第一个年份中的符合条件的所有月份
                if (!oneYear.equals(twoYear) && i == Integer.valueOf(oneYear) && s.equals(oneMonth)) {
                    dateList.add(i + s);
                    while (iterator.hasNext()) {
                        dateList.add(i + iterator.next());
                    }
                // 这个判断是用来添加 202401,202403 这种数据中，所有符合条件的月份
                } else if (oneYear.equals(twoYear) && s.equals(oneMonth)) {
                    dateList.add(i + s);
                    String temp = iterator.next();
                    while (Integer.valueOf(temp) <= Integer.valueOf(twoMonth)) {
                        dateList.add(i + temp);
                        temp = iterator.next();
                    }
                }
                // 剩下的情况，都在这里添加
                if (!oneYear.equals(twoYear) &&
                        (i != Integer.valueOf(oneYear) && i != Integer.valueOf(twoYear) ||
                        (i == Integer.valueOf(twoYear) && Integer.valueOf(s) <= Integer.valueOf(twoMonth)))) {
                    dateList.add(i + s);
                }
            }
        }
        return dateList;
    }

    /**
     * @Description 第一个版本：只是判断了重复的月份，并没有判断年份
     */
    public static void v1() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入第一次的两个日期,格式：(201301,201406):");
        String oneDate = scanner.next();
        System.out.print("请输入第二次的两个日期,格式：(201403,201409):");
        String twoDate = scanner.next();

        String[] oneStr = oneDate.split(",");
        String o1 = oneStr[0].substring(4);
        String o2 = oneStr[1].substring(4);

        String[] twoStr = twoDate.split(",");
        String t1 = twoStr[0].substring(4);
        String t2 = twoStr[1].substring(4);

        int count = 0;
        for (int i = Integer.valueOf(o1); i <= Integer.valueOf(o2); i++) {
            for (int j = Integer.valueOf(t1); j <= Integer.valueOf(t2); j++) {
                if (i == j) {
                    count++;
                    break;
                }
            }
        }
        System.out.println("重复的月份有" + count + "个月");
    }
}
